home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 September / PCWorld_2008-09_cd.bin / v cisle / sadanastroju / lightning-0.8-tb-win.xpi / chrome / calendar.jar / content / calendar / today-pane.js < prev    next >
Text File  |  2007-12-19  |  14KB  |  353 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.     - The Original Code is Sun Microsystems code.
  15.  *
  16.  * The Initial Developer of the Original Code is Sun Microsystems.
  17.  * Portions created by the Initial Developer are Copyright (C) 2005
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Berend Cornelius <berend.cornelius@sun.com>
  22.  *   Philipp Kewisch <mozilla@kewis.ch>
  23.  *
  24.  * Alternatively, the contents of this file may be used under the terms of
  25.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  26.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  27.  * in which case the provisions of the GPL or the LGPL are applicable instead
  28.  * of those above. If you wish to allow use of your version of this file only
  29.  * under the terms of either the GPL or the LGPL, and not to allow others to
  30.  * use your version of this file under the terms of the MPL, indicate your
  31.  * decision by deleting the provisions above and replace them with the notice
  32.  * and other provisions required by the GPL or the LGPL. If you do not delete
  33.  * the provisions above, a recipient may use your version of this file under
  34.  * the terms of any one of the MPL, the GPL or the LGPL.
  35.  *
  36.  * ***** END LICENSE BLOCK ***** */
  37.  
  38.  
  39.  
  40. var TodayPane = {
  41.   CurrentPaneView: 0,
  42.   paneViews: null,
  43.   stodaypaneButton: "calendar-show-todaypane-button",
  44.   start: null,
  45.   cwlabel: null,
  46.   dateFormatter: Components.classes["@mozilla.org/calendar/datetime-formatter;1"]
  47.                       .getService(Components.interfaces.calIDateTimeFormatter),
  48.   weekFormatter: Components.classes["@mozilla.org/calendar/weektitle-service;1"]
  49.                 .getService(Components.interfaces.calIWeekTitleService),
  50.  
  51.   onLoad: function onLoad() {
  52.     var addToolbarbutton = false;
  53.     var todaypanebox = document.getElementById("today-pane-panel");
  54.     this.paneViews = [ calGetString("calendar", "eventsandtasks"), calGetString("calendar", "tasksonly"), calGetString("calendar", "eventsonly") ];
  55.     var mailToolbar = getMailBar();
  56.     var defaultSetString = mailToolbar.getAttribute("defaultset");
  57.     if (defaultSetString.indexOf(this.stodaypaneButton) == -1) {
  58.       defaultSetString = this.addButtonToDefaultset(defaultSetString);
  59.       mailToolbar.setAttribute("defaultset", defaultSetString);
  60.     }
  61.  
  62.     // add the toolbarbutton to the mailtoolbarpalette on first startup
  63.     if (todaypanebox.hasAttribute("addtoolbarbutton")) {
  64.       addToolbarbutton = (todaypanebox.getAttribute("addtoolbarbutton") == "true");
  65.     }
  66.     if (addToolbarbutton) {
  67.       var currentSetString = mailToolbar.getAttribute("currentset");
  68.       if (currentSetString.indexOf(this.stodaypaneButton) == -1) {
  69.         this.addButtonToToolbarset();
  70.       }
  71.       todaypanebox.setAttribute("addtoolbarbutton", "false");
  72.     }
  73.  
  74.     var agendapanel = document.getElementById("agenda-panel");
  75.     var todopanel = document.getElementById("todo-tab-panel");
  76.     if (agendapanel.hasAttribute("collapsed")) {
  77.       if (!todopanel.hasAttribute("collapsed")) {
  78.         this.CurrentPaneView = 1;
  79.       }
  80.       else{
  81.         dump("Cannot display todaypane with both subpanes collapsed");
  82.       }
  83.     }
  84.     else {
  85.       if (todopanel.hasAttribute("collapsed")) {
  86.         this.CurrentPaneView = 2
  87.       }
  88.     }
  89.     agendaListbox.setupCalendar();
  90.     var todayheader = document.getElementById("today-pane-header");
  91.     todayheader.setAttribute("value", this.paneViews[this.CurrentPaneView]);
  92.  
  93.     // add a menuitem to the 'View/Layout' -menu. As the respective "Layout" menupopup
  94.     // carries no 'id' attribute it cannot be overlaid
  95.     var todayMenuItem = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "menuitem");
  96.     todayMenuItem.setAttribute("id", "menu_showTodayPane");
  97.     todayMenuItem.setAttribute("type", "checkbox");
  98.     todayMenuItem.setAttribute("command", "cmd_toggleTodayPane");
  99.     todayMenuItem.setAttribute("accesskey", calGetString("calendar", "todaypane-accesskey"));
  100.     todayMenuItem.setAttribute("key", "todaypanekey");
  101.     todayMenuItem.setAttribute("persist", "checked");
  102.     todayMenuItem.setAttribute("label", todaylabel);
  103.     var messagePaneMenu = document.getElementById("menu_MessagePaneLayout");
  104.     var messagePanePopupMenu = messagePaneMenu.firstChild;
  105.     messagePanePopupMenu.appendChild(todayMenuItem);
  106.     var checked = !todaypanebox.hasAttribute("collapsedinMailMode");
  107.     updateTodayPaneDisplay(checked);
  108.     this.checkMenuItem(checked);
  109.     this.initializeMiniday();
  110.     document.getElementById("today-splitter").addEventListener("DOMAttrModified", this.onModified, false);
  111.     this.setShortWeekdays();
  112.   },
  113.  
  114.   checkMenuItem: function checkMenuItem(checked) {
  115.     document.getElementById('cmd_toggleTodayPane').setAttribute("checked", checked);
  116.     var todayMenuItem = document.getElementById("menu_showTodayPane");
  117.     todayMenuItem.setAttribute("checked", checked);
  118.     var toolbarbutton = document.getElementById(this.stodaypaneButton);
  119.     if (toolbarbutton != null) {
  120.       toolbarbutton.setAttribute("checked", checked);
  121.     }
  122.     var todayCloser = document.getElementById("today-closer");
  123.     todayCloser.setAttribute("checked", false);
  124.   },
  125.  
  126.   initializeMiniday: function initializeMiniday() {
  127.     // initialize the label denoting the current month, year and calendarweek
  128.     // with numbers that are supposed to consume the largest width
  129.     // in order to guarantee that the text will not be cropped when modified
  130.     // during runtime
  131.     const kYEARINIT= "5555";
  132.     const kCALWEEKINIT= "55";
  133.     var monthdisplaydeck = document.getElementById("monthNameContainer");
  134.     var childNodes = monthdisplaydeck.childNodes;
  135.  
  136.     for (var i = 0; i < childNodes.length; i++) {
  137.       var monthlabel = childNodes[i];
  138.       this.setMonthDescription(monthlabel, i,  kYEARINIT, kCALWEEKINIT);
  139.     }
  140.     agendaListbox.addListener(this);
  141.     this.setDay(now());
  142.   },
  143.  
  144.   setMonthDescription: function setMonthDescription(aMonthLabel, aIndex, aYear, aCalWeek) {
  145.     if (this.cwlabel == null) {
  146.       this.cwlabel = calGetString("calendar", "shortcalendarweek");
  147.     }
  148.     return aMonthLabel.value = this.dateFormatter.shortMonthName(aIndex)
  149.             + " " + aYear +  ", " + this.cwlabel + " " +  aCalWeek;
  150.   },
  151.  
  152.   addButtonToDefaultset: function addButtonToDefaultSet(toolbarSetString) {
  153.     var mailToolbar = getMailBar();
  154.     var elementcount = mailToolbar.childNodes.length;
  155.     var buttonisWithinSet = false;
  156.     // by default the todaypane-button is to be placed before the first
  157.     // separator of the toolbar
  158.     for (var i = 0; i < elementcount; i++) {
  159.       var element = mailToolbar.childNodes[i];
  160.       if (element.localName == "toolbarseparator") {
  161.           var separatorindex = toolbarSetString.indexOf("separator");
  162.           if (separatorindex > -1) {
  163.             var firstSubString = toolbarSetString.substring(0, separatorindex);
  164.             var secondSubString = toolbarSetString.substring(separatorindex);
  165.             toolbarSetString = firstSubString + this.stodaypaneButton + "," + secondSubString;
  166.           }
  167.           buttonisWithinSet = true;
  168.           break;
  169.       }
  170.     }
  171.     if (!buttonisWithinSet) {
  172.       // in case there is no separator within the toolbar we append the
  173.       // toddaypane-button
  174.       toolbarSetString += "," + this.stodaypaneButton;
  175.     }
  176.     return toolbarSetString;
  177.   },
  178.  
  179.   addButtonToToolbarset: function addButtonToToolbarset() {
  180.     var mailToolbar = getMailBar();
  181.     var elementcount = mailToolbar.childNodes.length;
  182.     var buttonisWithinSet = false;
  183.     // by default the todaypane-button is to be placed before the first
  184.     // separator of the toolbar
  185.     for (var i = 0; i < elementcount; i++) {
  186.       var element = mailToolbar.childNodes[i];
  187.       if (element.localName == "toolbarseparator") {
  188.           mailToolbar.insertItem(this.stodaypaneButton, element, null, false);
  189.           buttonisWithinSet = true;
  190.           break;
  191.       }
  192.     }
  193.     if (!buttonisWithinSet) {
  194.       // in case there is no separator within the toolbar we append the
  195.       // toddaypane-button
  196.       mailToolbar.insertItem(this.stodaypaneButton, null, null, false);
  197.     }
  198.   },
  199.  
  200.   // we can cycle the pane view forward or backwards
  201.   cyclePaneView: function cyclePaneView(aCycleForward) {
  202.     function _collapsePanel(oPanel, bCollapse)
  203.     {
  204.       if (bCollapse) {
  205.         oPanel.setAttribute("collapsed", bCollapse)
  206.       }
  207.       else{
  208.         oPanel.removeAttribute("collapsed")
  209.       }
  210.     }
  211.  
  212.     this.CurrentPaneView = this.CurrentPaneView + aCycleForward;
  213.     var nViewLen = this.paneViews.length;
  214.     if (this.CurrentPaneView >= nViewLen) {
  215.       this.CurrentPaneView = 0;
  216.     }
  217.     else if (this.CurrentPaneView == -1) {
  218.       this.CurrentPaneView = nViewLen -1;
  219.     }
  220.     var agendapanel = document.getElementById("agenda-panel");
  221.     var todopanel = document.getElementById("todo-tab-panel");
  222.     var todayheader = document.getElementById("today-pane-header");
  223.     todayheader.setAttribute("value", this.paneViews[this.CurrentPaneView]);
  224.     switch (this.CurrentPaneView) {
  225.       case 0:
  226.         _collapsePanel(agendapanel, false);
  227.         _collapsePanel(todopanel, false);
  228.         document.getElementById("today-pane-splitter").removeAttribute("hidden");
  229.         break;
  230.       case 1:
  231.         _collapsePanel(agendapanel, true);
  232.         _collapsePanel(todopanel, false);
  233.         document.getElementById("today-pane-splitter").setAttribute("hidden", "true");
  234.         break;
  235.       case 2:
  236.         _collapsePanel(agendapanel, false);
  237.         _collapsePanel(todopanel, true);
  238.         document.getElementById("today-pane-splitter").setAttribute("hidden", "true");
  239.         break;
  240.     }
  241.   },
  242.  
  243.   setShortWeekdays: function setShortWeekdays() {
  244.     var weekdisplaydeck = document.getElementById("weekdayNameContainer");
  245.     var childNodes = weekdisplaydeck.childNodes;
  246.     for (var i = 0; i < childNodes.length; i++) {
  247.       childNodes[i].setAttribute("value", calGetString("dateFormat","day." + (i+1) + ".Mmm"));
  248.     }
  249.   },
  250.  
  251.   setDaywithjsDate: function setDaywithjsDate(aNewDate) {
  252.     var newdatetime = jsDateToDateTime(aNewDate);
  253.     newdatetime = newdatetime.getInTimezone(calendarDefaultTimezone());
  254.     document.getElementById("aMinimonthPopupset").hidePopup();
  255.     return this.setDay(newdatetime);
  256.   },
  257.  
  258.   getDay: function getDay(aNewDate)
  259.   {
  260.       return this.start;
  261.   },
  262.  
  263.   setDay: function setDay(aNewDate) {
  264.     this.start = aNewDate.clone();
  265.  
  266.     var daylabel = document.getElementById("datevalue-label");
  267.     daylabel.value = this.start.day;
  268.     var weekdaylabel = document.getElementById("weekdayNameContainer");
  269.     weekdaylabel.selectedIndex = this.start.weekday;
  270.  
  271.     var monthnamedeck = document.getElementById("monthNameContainer");
  272.     monthnamedeck.selectedIndex = this.start.month;
  273.  
  274.     var selMonthPanel = monthnamedeck.selectedPanel;
  275.     this.updatePeriod();
  276.     return this.setMonthDescription(selMonthPanel, this.start.month,
  277.                                    this.start.year,
  278.                                    this.weekFormatter.getWeekTitle(this.start));
  279.   },
  280.  
  281.   advance: function advance(dir) {
  282.     this.start.day += dir;
  283.     this.setDay(this.start);
  284.   },
  285.  
  286.   showsToday: function showsToday() {
  287.     return (sameDay(now(), this.start));
  288.   },
  289.  
  290.   showsYesterday: function showsYesterday() {
  291.     return (sameDay(yesterday(), this.start));
  292.   },
  293.  
  294.   updatePeriod: function updatePeriod() {
  295.     var date = this.start.clone();
  296.     return agendaListbox.refreshPeriodDates(date);
  297.   },
  298.  
  299.   // DOMAttrModified handler that listens to the todaypane-splitter
  300.   onModified: function onModified(aEvent) {
  301.     if (aEvent.attrName == "state") {
  302.       var checked = aEvent.newValue != "collapsed";
  303.       TodayPane.checkMenuItem(checked);
  304.       var todaypanebox = document.getElementById("today-pane-panel");
  305.       if (checked) {
  306.         todaypanebox.removeAttribute("collapsedinMailMode");
  307.       }
  308.       else {
  309.         todaypanebox.setAttribute("collapsedinMailMode", true);
  310.       }
  311.     }
  312.   }
  313. };
  314.  
  315.  
  316. function loadTodayPane() {
  317.   TodayPane.onLoad();
  318. }
  319.  
  320. window.addEventListener("load", loadTodayPane, false);
  321.  
  322. function updateTodayPaneDisplay() {
  323.   var deck = document.getElementById("displayDeck");
  324.   var id = null;
  325.   try { id = deck.selectedPanel.id } catch (e) { }
  326.  
  327.   var todaysplitter = document.getElementById("today-splitter");
  328.   if (id == "calendar-view-box" || id == "calendar-task-box") {
  329.     // we collapse the todaypane but don't not affect the
  330.     // attribute "collapsedinMailMode". Therefor this function is only to be used
  331.     // when switching to calendar mode
  332.     var oTodayPane = document.getElementById("today-pane-panel");
  333.     oTodayPane.setAttribute("collapsed", true);
  334.     document.getElementById('cmd_toggleTodayPane').setAttribute("disabled","true");
  335.     todaysplitter.setAttribute("collapsed", "true");
  336.   }
  337.   else {
  338.     // only show the today-pane if was not collapsed during the last
  339.     // "mail-mode session"
  340.     var oTodayPane = document.getElementById("today-pane-panel");
  341.     if (!oTodayPane.hasAttribute("collapsedinMailMode")) {
  342.       if (oTodayPane.hasAttribute("collapsed")) {
  343.         oTodayPane.removeAttribute("collapsed");
  344.       }
  345.     }
  346.     document.getElementById('cmd_toggleTodayPane').removeAttribute("disabled");
  347.     todaysplitter.removeAttribute("collapsed");
  348.   }
  349. }
  350.  
  351. document.getElementById("displayDeck").
  352.     addEventListener("select", updateTodayPaneDisplay, true);
  353.